home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 002 / fspool.arc / FSPOOL.ASM next >
Assembly Source File  |  1985-07-09  |  12KB  |  352 lines

  1.         PAGE    60,132
  2.         TITLE   SPOOL - SPOOL PRINTER TO DISK
  3. COMMENT *
  4.         SPOOL: THIS DOS COMMAND SPOOLS EVERYTHING WHICH GOES TO THE
  5.                PARALLEL PRINTER TO A DISK FILE. DATA IS COLLECTED UNTIL
  6.                A SECOND SPOOL COMMAND IS ISSUED.
  7.  
  8.                FORMAT:
  9.                         SPOOL <FILENAME>
  10.  
  11.                         IF NO <FILENAME> IS GIVEN, THE PREVIOUS FILE IS
  12.                         CLOSED AND ALL FURTHER PRINTER DATA GOES TO THE
  13.                         PRINTER.
  14.  
  15.         PROGRAMMER: DON D WORTH - UCLA/OAC - 1/5/84
  16.  
  17.         ENTRY POINTS: +100 = STANDARD INITIAL COMMAND ENTRY
  18.                       +103 = PRINTER INTERRUPT ENTRY POINT
  19.  
  20.         TO LINK:        LINK SPOOL,SPOOL,SPOOL;
  21.                         DEBUG SPOOL.EXE
  22.                         N SPOOL.COM
  23.                         W
  24.                         Q
  25.  
  26.         *
  27. BUFSIZ  EQU     200H            ;SIZE OF DMA BUFFER
  28. ;
  29. CONOUT  EQU     02H             ; CONSOLE OUTPUT
  30. PRINT   EQU     09H             ; PRINT STRING
  31. OPEN    EQU     0FH             ; OPEN FILE
  32. CLOSE   EQU     10H             ; CLOSE FILE
  33. DELETE  EQU     13H             ; DELETE FILE
  34. MAKE    EQU     16H             ; MAKE FILE
  35. SETDMA  EQU     1AH             ; SET DMA ADDRESS
  36. WRITER  EQU     22H             ; RANDOM WRITE
  37. GETDMA  EQU     2FH             ; GET DMA ADDRESS
  38. ;
  39. BELL    EQU     07H             ;BELL
  40. CR      EQU     0DH             ;CARRIAGE RETURN
  41. LF      EQU     0AH             ;LINE FEED
  42. SPACE   EQU     20H             ;SPACE
  43. ;
  44. PGM     GROUP   ASEG,CSEG,DSEG
  45.         ASSUME  CS:PGM,DS:PGM
  46. ;
  47. ;       PREFIX SEGMENT
  48. ;
  49. ASEG    SEGMENT PARA COMMON 'CODE'
  50. INT20   LABEL   NEAR
  51.         DW      ?
  52. MEMSIZ  DW      ?               ;TOTAL MEMORY SIZE
  53.         DB      ?
  54. BDOS    LABEL   NEAR
  55.         DB      5 DUP(?)        ;LONG CALL TO DOS
  56. TERMAD  DW      ?,?             ;TERMINATE ADDRESS
  57. CTLBRK  DW      ?,?             ;CONTROL-BREAK EXIT
  58.         DW      37 DUP(?)       ;RESERVED
  59. FCB1    DB      16 DUP(?)       ;FIRST FCB
  60. FCB2    DB      16 DUP(?)       ;SECOND FCB
  61.         DW      ?,?             ;RESERVED
  62. DMA     DB      128 DUP(?)      ;DMA SECTOR BUFFER
  63. ;
  64. ASEG    ENDS
  65. ;
  66. ;       DATA SEGMENT
  67. ;
  68. DSEG    SEGMENT PARA PUBLIC 'DATA'
  69. ;
  70. MSG     DB      CR,LF,'SPOOL INSTALLED',CR,LF,'$'
  71. MSGOPN  DB      CR,LF,'NO ROOM IN DIRECTORY FOR SPOOL FILE',BELL,CR,LF,'$'
  72. ;
  73. DSEG    ENDS
  74. ;
  75. ;       START OF CODE
  76. ;
  77. CSEG    SEGMENT PARA PUBLIC 'CODE'
  78. ;
  79. ;       NORMAL COMMAND ENTRY
  80. ;
  81. SPOOL:  JMP     INIT                    ;GO TO INIT CODE
  82. ;
  83. ;       PARALLEL PRINTER INTERRUPT EXIT - INT 17H
  84. ;
  85. INTENT: STI                             ;INTERRUPTS BACK ON
  86.         PUSH    DS
  87.         PUSH    BX
  88.         PUSH    CX
  89.         PUSH    DX
  90.         PUSH    SI
  91.         PUSH    DI
  92.         PUSH    AX
  93.         MOV     SI,CS
  94.         MOV     DS,SI                   ;SET UP DATA SEGMENT
  95.         CMP     BYTE PTR FLAG,0         ;IS FILE AVAILABLE?
  96.         JNZ     MYINT                   ;YES, GO ON
  97.         POP     AX
  98.         POP     DI
  99.         POP     SI
  100.         POP     DX
  101.         POP     CX
  102.         POP     BX
  103.         POP     DS
  104.         JMP     DWORD PTR CS:VEC        ;ELSE, GO TO REAL EXIT
  105. ;
  106. MYINT:  OR      AH,AH                   ;AH=0 : PRINT CHARACTER IN AL
  107.         JNZ     INTEXT
  108.         MOV     SI,SS
  109.         MOV     WORD PTR STKSAV+2,SI    ;SAVE CALLER'S STACK
  110.         MOV     SI,SP
  111.         MOV     WORD PTR STKSAV,SI
  112.         MOV     SI,CS
  113.         MOV     SS,SI                   ;GIVE ME NEW BIGGER STACK
  114.         MOV     SI,OFFSET PGM:STK
  115.         MOV     SP,SI
  116.         CALL    PRNT                    ;PRINT THE CHARACTER
  117.         MOV     SI,WORD PTR STKSAV
  118.         MOV     SP,SI                   ;RESTORE CALLER'S STACK
  119.         MOV     SI,WORD PTR STKSAV+2
  120.         MOV     SS,SI
  121. ;
  122. INTEXT: POP     AX                      ;ALL OTHERS PRODUCE ZERO RC
  123.         MOV     AH,90H                  ;SIMULATE BUSY/SELECTED
  124.         POP     DI
  125.         POP     SI
  126.         POP     DX
  127.         POP     CX
  128.         POP     BX
  129.         POP     DS
  130.         IRET
  131. ;
  132. ;       ADD CHARACTER TO PRINT BUFFER
  133. ;
  134. PRNT:   CMP     BYTE PTR FLAG,0         ;MAKE SURE A FILE IS AVAIL.
  135.         JZ      INTEXT
  136.         PUSH    AX
  137.         CMP     WORD PTR LEFT,BUFSIZ    ;BUFFER FULL?
  138.         JNE     INTADD                  ;NO
  139.         CALL    FLUSH                   ;YES, FLUSH BUFFER
  140. INTADD: POP     AX
  141.         MOV     BX,WORD PTR LEFT
  142.         ADD     BX,OFFSET PGM:BUFFER
  143.         MOV     [BX],AL                 ;MOVE BYTE TO BUFFER
  144.         INC     WORD PTR LEFT
  145. RET:    RET                             ;DONE FOR NOW
  146. ;
  147. ;       FLUSH PRINT BUFFER TO DISK FILE
  148. ;
  149. FLUSH:  XOR     AX,AX
  150.         CMP     AX,WORD PTR DS:LEFT     ;BUFFER NON-EMPTY?
  151.         JE      RET                     ;EMPTY, SKIP IT
  152.         MOV     WORD PTR DS:LEFT,AX     ;ELSE, RESET IT
  153. ;
  154.         PUSH    ES
  155.         PUSH    DS
  156. ;
  157. ;       EL KLUDGEO: PRESERVE A CHUNK OF DOS 2.0 ACROSS INT 21H
  158. ;
  159.         MOV     AX,DS                   ;COPY TO MY SEGMENT
  160.         MOV     ES,AX
  161.         MOV     AX,DS:STKSAV+2          ;COPYING FROM CALLER'S STACK
  162.         MOV     DS,AX
  163.         MOV     SI,0                    ;MAGIC OFFSET TO DOS'S STACK
  164.         MOV     DI,(OFFSET PGM:DOSSTK)
  165.         MOV     CX,0C80H                ;LENGTH TO SAVE
  166.         CLD
  167.         REP     MOVSB                   ;COPY DOS'S STACK
  168.         POP     DS
  169.         PUSH    DS
  170. ;
  171.         MOV     AH,GETDMA
  172.         INT     21H
  173.         PUSH    ES                      ;SAVE OLD DMA ADDR
  174.         PUSH    BX
  175.         MOV     DX,OFFSET PGM:BUFFER
  176.         MOV     AH,SETDMA
  177.         INT     21H                     ;SET UP MY DMA
  178.         MOV     DX,OFFSET PGM:FCB
  179.         MOV     AH,OPEN
  180.         INT     21H                     ;REOPEN FILE
  181. ;
  182.         MOV     AX,WORD PTR DS:CURREC
  183.         MOV     WORD PTR DS:FCB+33,AX      ;SET NEW RECORD TO WRITE
  184.         MOV     WORD PTR DS:FCB+14,BUFSIZ  ;AND RECORD SIZE
  185.         MOV     DX,OFFSET PGM:FCB
  186.         MOV     AH,WRITER
  187.         INT     21H                     ;WRITE BUFFER TO DISK
  188.         OR      AL,BYTE PTR DS:SAVE     ;SAVE RC
  189.         MOV     BYTE PTR DS:SAVE,AL
  190.         INC     WORD PTR DS:CURREC      ;NEXT RECORD NEXT TIME
  191. ;
  192.         MOV     DX,OFFSET PGM:FCB
  193.         MOV     AH,CLOSE
  194.         INT     21H                     ;CLOSE THE FILE TO FLUSH BUFFS
  195.         POP     DX
  196.         POP     DS
  197.         MOV     AH,SETDMA               ;RESTORE OLD DMA
  198.         INT     21H
  199. ;
  200.         POP     DS
  201.         POP     ES
  202. ;
  203.         CMP     BYTE PTR DS:SAVE,'0'    ;DID IT WORK?
  204.         JNE     IOERR
  205. ;
  206. FLHOUT: MOV     AX,DS:STKSAV+2          ;COPYING TO DOS'S WORKAREA
  207.         CMP     AX,100H
  208.         JA      FRET                    ;MUST BE DOS'S SEGMENT
  209.         PUSH    ES
  210.         MOV     ES,AX
  211.         MOV     DI,0                    ;RESTORE DATA AREAS
  212.         MOV     SI,(OFFSET PGM:DOSSTK)
  213.         MOV     CX,0C80H                ;LENGTH TO RESTORE
  214.         CLD
  215.         REP     MOVSB                   ;COPY DOS'S STACK
  216.         POP     ES                      ;RESTORE ES
  217. FRET:   RET
  218. ;
  219. IOERR:  XOR     AX,AX
  220.         INT     10H                     ;CLEAR SCREEN
  221.         MOV     SI,(OFFSET PGM:MSGERR)
  222. MSGLP:  MOV     AL,[SI]                 ;GET NEXT CHARACTER
  223.         CMP     AL,'$'                  ;END OF MESSAGE?
  224.         JE      IOEOUT
  225.         XOR     BX,BX                   ;NO...
  226.         MOV     AH,14
  227.         INT     10H                     ;WRITE CHARACTER
  228.         INC     SI
  229.         JMP     MSGLP
  230. IOEOUT: MOV     BYTE PTR DS:FLAG,0      ;MARK FILE CLOSED
  231.         JMP     FLHOUT
  232. ;
  233. ;       PERMANENT DATA AREA (ALWAYS USE DS: FROM CODE BELOW)
  234. ;
  235. FLAG    DB      0               ;FILE OPEN FLAG
  236. FCB     DB      37 DUP(0)       ;FILE CONTROL BLOCK
  237. MSGERR  DB      BELL,BELL,BELL,'SPOOL WRITE ERROR - '
  238. SAVE    DB      '0$'
  239. VEC     DD      0               ;OLD PRINT INT HANDLER
  240. LEFT    DW      0               ;BYTES LEFT IN DMA BUFFER
  241. CURREC  DW      0               ;CURRENT RECORD TO WRITE
  242. BUFFER  DB      BUFSIZ DUP(?)   ;WRITE BUFFER
  243. DOSSTK  DB      0C80H DUP(?)    ;PLACE TO SAVE INT 21H'S STACK
  244. STKSAV  DD      0               ;CALLER'S STACK EA
  245.         DB      64 DUP('STACK   ')
  246. STK     EQU     THIS BYTE
  247. ;
  248. ;       SEE IF A FILE IS ALREADY OPEN
  249. ;
  250. INIT:   CALL    CHKVEC                  ;FIND PREVIOUS WORKAREA
  251.         CMP     BYTE PTR DS:FLAG,0      ;FILE OPEN OR CLOSED?
  252.         JE      NOCLS                   ;CLOSED, NO CLOSE NEEDED
  253.         MOV     AL,1AH
  254.         MOV     WORD PTR DS:STKSAV+2,AX ;MAKE SURE WE DON'T RESTORE STUFF
  255.         CALL    PRNT                    ;PRINT END OF FILE MARK
  256.         CALL    FLUSH                   ;FLUSH OUT WRITE BUFFER
  257.         MOV     BYTE PTR DS:FLAG,0      ;NO LONGER OPEN
  258. ;
  259. ;       COPY NEW FCB1 TO PERMANENT FCB
  260. ;
  261. NOCLS:  CMP     BYTE PTR ES:FCB1+1,20H  ;BLANK FILENAME?
  262.         JE      INSTAL                  ;THEN DON'T OPEN IT
  263.         MOV     SI,(OFFSET PGM:FCB1)
  264.         MOV     DI,(OFFSET PGM:FCB)
  265.         MOV     CX,35                   ;LENGTH OF AN FCB
  266.         PUSH    ES
  267.         PUSH    DS
  268.         POP     ES                      ;SWAP SEGMENTS
  269.         POP     DS
  270.         CLD
  271.         REP     MOVSB                   ;MOVE IT
  272.         PUSH    ES
  273.         PUSH    DS
  274.         POP     ES
  275.         POP     DS                      ;SWAP SEGMENTS BACK
  276. ;
  277. ;       OPEN NEW FCB
  278. ;
  279.         MOV     DX,(OFFSET PGM:FCB)
  280.         MOV     AH,DELETE
  281.         INT     21H                     ;DELETE OLD FILE
  282.         MOV     DX,(OFFSET PGM:FCB)
  283.         MOV     AH,MAKE
  284.         INT     21H                     ;CREATE IT
  285.         CMP     AL,0FFH
  286.         JNE     ITSOPN                  ;ALL WENT WELL?
  287.         MOV     DX,(OFFSET PGM:MSGOPN)
  288.         MOV     AH,PRINT
  289.         INT     21H                     ;'OPEN FAILED'
  290.         XOR     AX,AX
  291.         INT     21H                     ;TERMINATE
  292. ;
  293. ;       SET UP OPEN FILE, CLEAR BUFFER
  294. ;
  295. ITSOPN: MOV     BYTE PTR DS:FLAG,0FFH   ;MARK FILE AS OPEN
  296.         MOV     WORD PTR DS:CURREC,0    ;RESET CURRENT RECORD
  297.         MOV     WORD PTR DS:LEFT,0      ;NOTHING IN WRITE BUFFER NOW
  298. ;
  299.         MOV     AH,CLOSE
  300.         MOV     DX,(OFFSET PGM:FCB)
  301.         INT     21H                     ;CLOSE FILE UNTIL WE NEED IT
  302. ;
  303. ;       INSTALL PRINT INTERCEPT IF NECESSARY
  304. ;
  305. INSTAL: CALL    CHKVEC                  ;IS ONE ALREADY INSTALLED?
  306.         JE      EXIT                    ;YES, NOTHING ELSE TO DO
  307.         PUSH    DS
  308.         XOR     AX,AX
  309.         MOV     DS,AX
  310.         MOV     AX,WORD PTR DS:005CH    ;SAVE OLD VECTOR
  311.         MOV     WORD PTR CS:VEC,AX
  312.         MOV     AX,WORD PTR DS:005EH
  313.         MOV     WORD PTR CS:VEC+2,AX
  314.         MOV     AX,(OFFSET PGM:INTENT)
  315.         MOV     WORD PTR DS:005CH,AX    ;INSTALL PARALLEL INT
  316.         MOV     AX,CS
  317.         MOV     WORD PTR DS:005EH,AX
  318.         POP     DS
  319. ;
  320.         MOV     DX,OFFSET PGM:MSG
  321.         MOV     AH,PRINT
  322.         INT     21H                     ;'SPOOL INSTALLED'
  323. ;
  324. ;       EXIT LEAVING ME IN MEMORY
  325. ;
  326.         MOV     DX,OFFSET PGM:INIT
  327.         INT     27H                     ;EXIT BUT STAY RESIDENT
  328. ;
  329. ;       EXIT NORMALLY
  330. ;
  331. EXIT:   MOV     AX,CS                   ;PUT BACK SEGMENT
  332.         MOV     DS,AX
  333.         XOR     AX,AX
  334.         INT     21H                     ;EXIT COMPLETELY
  335. ;
  336. ;       CHECK PARALLEL PRINTER VECTOR FOR INTERCEPT
  337. ;
  338. CHKVEC: XOR     AX,AX                   ;CHECK INT VECTORS
  339.         MOV     DS,AX                   ;FOR PARALLEL PRINTER
  340.         MOV     AX,WORD PTR DS:005CH    ;GET OFFSET PART
  341.         CMP     AX,(OFFSET PGM:INTENT)  ;SAME AS MY INTERCEPT'S
  342.         JE      SETES                   ;IF SO, USE OLD COPY
  343.         MOV     AX,CS                   ;RESTORE DS REG
  344.         MOV     DS,AX
  345.         RET
  346. SETES:  MOV     AX,WORD PTR DS:005EH    ;GET SEGMENT OF OTHER ME
  347.         MOV     DS,AX                   ;AND USE IT INSTEAD
  348.         RET                             ; CS: AND ES: REMAIN THE SAME
  349. ;
  350. CSEG    ENDS
  351.         END
  352.